/**
 *  一句话思路：线段树
    算法描述：
    解决所需数据结构+算法：
**/
#include<iostream>
using namespace std;

#define N 500010
#define lc p<<1
#define rc p<<1|1

struct tree{
    int l, r, sum;
}t[N*4];
int a[N];

void built(int p, int l, int r) {
    // 建立线段树
    t[p] = {l, r, a[l]};
    if(l == r)  return;
    int m = (l + r) >> 1;
    built(lc, l, m);
    built(rc, m+1, r);
    t[p].sum = t[lc].sum + t[rc].sum;
}

void update(int p, int x, int k) {
    if(x<t[p].l || x>t[p].r)    return ;
    t[p].sum += k;
    if(t[p].l == t[p].r)    return ;
    update(lc, x, k);
    update(rc, x, k);
    t[p].sum = t[lc].sum + t[rc].sum;
}

int query(int p, int x, int y) {
    if(x > t[p].r || t[p].l > y)    return 0;
    if(x <= t[p].l && t[p].r<=y)    return t[p].sum;
    return query(lc, x, y) + query(rc, x, y);
}

int main() {
    int n, m, op, x, y, k;
    cin >> n >> m;
    for(int i=1; i<=n; i++) cin >> a[i];
    built(1, 1, n);
    while(m--) {
        cin >> op >> x;
        if(op == 1) {
            cin >> k;
            update(1, x, k);
        } else {
            cin >> y;
            cout << query(1, x, y) << endl;
        }
    }
    return 0;
}